package cn.tedu.csmallsso.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.Map;

/**
 * 该工具类是用来生成和解析JWT
 * 因为JWT使用的地方比较多，相同代码重复编写，代码冗余
 */
@Slf4j
public class JwtUtils {
    //指定秘钥，至少三位以上，秘钥如果太短，容易被破解
    private static final String SECRET_KEY = "jadsagflksdngs";
    //指定有效期，以分钟为单位，有效期为7天
    private static final Long EXPIRED_IN_MINUTE = 7L*24*60;
    //私有化无参构造方法，避免外部随意创建对象
    private JwtUtils(){}

    //生成JWT
    public static String generate(Map<String,Object> claims){
        Date expirationDate = new Date(System.currentTimeMillis() + EXPIRED_IN_MINUTE * 60 * 1000);

        //JWT的组成
        String jwt = Jwts.builder()
                .setHeaderParam("typ","jwt")  //指定类型
                .setHeaderParam("alg","HS256")//指定使用的算法
                .setClaims(claims)  //封住到JWT的数据
                .setExpiration(expirationDate) //指定有效期
                .signWith(SignatureAlgorithm.HS256,SECRET_KEY)//指定算法与秘钥
                .compact();//打包
        log.info(jwt);
        return jwt;
    }
    //解析JWT
    public static Claims parse(String jwt){
        Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(jwt).getBody();
        return claims;
    }
}
